/** 
 * SINGLETON原则
 * 1 单体对象只存在一份
 * 2 类可以被扩充，但不可一被修改
 * 3 JS中字面量默认单体对象
 *
 */


/**
 * 仅以字面量创建单例
 * 命名上以下划线区分是否私有
 */


const singletonOne = {
  
  _name: 'zhang',
  
  _gender: 'female',

  getGender: function() {
    return this._gender
  },
  
  getName: function() {
    return this._name
  }
  
}


/**
 * 带命名空间单例 或者以约定的形式配置
 * 包装形如ONE
 * 好处: 给不同的单例分配到独立的命名空间, 禁用全局变量
 */
const namespace = {
  singletonOneHandler: singletonOne
}

console.log(namespace.singletonOneHandler.getGender())

/**
 * 闭包形式单例
 * 不需要用名字来隐含属性信息
 * 可以真正实现变量私有
 */

